package com.ada.common.util;

import android.net.Uri;
import android.os.Environment;

import org.devio.takephoto.app.TakePhoto;
import org.devio.takephoto.compress.CompressConfig;
import org.devio.takephoto.model.CropOptions;
import org.devio.takephoto.model.TakePhotoOptions;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;


/**
 * - 支持通过相机拍照获取图片
 * - 支持从相册选择图片
 * - 支持从文件选择图片
 * - 支持多图选择
 * - 支持批量图片裁切
 * - 支持批量图片压缩
 * - 支持对图片进行压缩
 * - 支持对图片进行裁剪
 * - 支持对裁剪及压缩参数自定义
 * - 提供自带裁剪工具(可选)
 * - 支持智能选取及裁剪异常处理
 * - 支持因拍照Activity被回收后的自动恢复
 * Author: crazycodeboy
 * Date: 2016/9/21 0007 20:10
 * Version:4.0.0
 * 技术博文：http://www.cboy.me
 * GitHub:https://github.com/crazycodeboy
 * Eamil:crazycodeboy@gmail.com
 */
public class CustomHelper {

    public final static int PICK_BY_TAKE = 0;//拍照
    public final static int PICK_BY_SELECT = 1;//本地选择

    public static void TakePhoto(TakePhoto takePhoto, int type, boolean isCrop) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMM/dd");
        Date curDate = new Date(System.currentTimeMillis());//获取当前时间
        String str = formatter.format(curDate);
        File file = new File(Environment.getExternalStorageDirectory(), "/" + str + "/" + getItemID(32) + ".jpg");
        if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
        Uri imageUri = Uri.fromFile(file);

        configCompress(takePhoto);
        configTakePhotoOption(takePhoto);

        switch (type) {
            case PICK_BY_SELECT:
                int limit = Integer.parseInt("1");//设置最多选择几张
                if (limit > 1) {
                    takePhoto.onPickMultipleWithCrop(limit, getCropOptions(isCrop));//需要裁切
                    takePhoto.onPickMultiple(limit);//不需要裁切
                    return;
                }

                /*从哪儿选择（文件）与以下二选一 **/
////        takePhoto.onPickFromDocumentsWithCrop(imageUri,getCropOptions());//需要裁切才设置
//        takePhoto.onPickFromDocuments();//不需裁切设置该属性


                /*从哪儿选择（相册 默认）**/
                if (isCrop)
                    takePhoto.onPickFromGalleryWithCrop(imageUri, getCropOptions(isCrop));//需要裁切-才设置该属性
                else
                    takePhoto.onPickFromGallery();//不需裁切-设置该属性

                break;
            case PICK_BY_TAKE:
                /*从哪儿选择（文件）与以下二选一 **/
                if (isCrop)
                    takePhoto.onPickFromCaptureWithCrop(imageUri, getCropOptions(isCrop));//需要裁切才设置
                else
                    takePhoto.onPickFromCapture(imageUri);//不需裁切设置该属性

                break;
        }

    }

    private static void configTakePhotoOption(TakePhoto takePhoto) {
        TakePhotoOptions.Builder builder = new TakePhotoOptions.Builder();
        /* 以下二选一**/
        builder.setWithOwnGallery(false);//设置本地选择相册时候true为takePhoto自定义相册，false为系统自带相册
        builder.setCorrectImage(true);//是否纠正拍照的照片旋转角度

        takePhoto.setTakePhotoOptions(builder.create());

    }

    private static void configCompress(TakePhoto takePhoto) {

//        takePhoto.onEnableCompress(null,false);//不压缩的时候要直接return;
//        return;

        int maxSize = Integer.parseInt("102400");//设置大小不超过b
        int width = Integer.parseInt("800");
        int height = Integer.parseInt("800");

        /* 压缩模式二者选一**/
        CompressConfig config;
        //自带的压缩工具
        config = new CompressConfig.Builder()
                .setMaxSize(maxSize)//设置大小不超过b
                .setMaxPixel(width >= height ? width : height)//设置宽高
                .enableReserveRaw(true)//是否保存原图
                .create();

//        //luban压缩工具
//        LubanOptions option=new LubanOptions.Builder()
//                .setMaxHeight(height)
//                .setMaxWidth(width)
//                .setMaxSize(maxSize)
//                .create();
//        config= CompressConfig.ofLuban(option);
//        config.enableReserveRaw(true);//是否保存原图

        takePhoto.onEnableCompress(config, true);


    }

    private static CropOptions getCropOptions(boolean isCrop) {

        /*二选一**/
        if (isCrop) {
            //需要裁切不屏蔽下面代码
            CropOptions.Builder builder = new CropOptions.Builder();
            //        builder.setAspectX(width).setAspectY(height);//设置裁切宽高
            builder.setOutputX(800).setOutputY(800);//设置裁切宽高(默认)
            builder.setWithOwnCrop(false);//true takePhoto自带，false为第三方官方自带
            return builder.create();
        } else
            return null;//不需要裁切直接返回null

    }

    /**
     * 生成随机数当作getItemID
     * n ： 需要的长度
     *
     * @return
     */
    private static String getItemID(int n) {
        String val = "";
        Random random = new Random();
        for (int i = 0; i < n; i++) {
            String str = random.nextInt(2) % 2 == 0 ? "num" : "char";
            if ("char".equalsIgnoreCase(str)) { // 产生字母
                int nextInt = random.nextInt(2) % 2 == 0 ? 65 : 97;
                // System.out.println(nextInt + "!!!!"); 1,0,1,1,1,0,0
                val += (char) (nextInt + random.nextInt(26));
            } else if ("num".equalsIgnoreCase(str)) { // 产生数字
                val += String.valueOf(random.nextInt(10));
            }
        }
        return val;
    }


}
